$(document).ready(function(){
	var BB_CONST = {
		'max-message-len'     : 2000,
		'recaptcha_publickey' : '6LezncsSAAAAAKzy4LGOcpiqO_WXXvb0vevom_PS'
	};
	
    var BB_I8N = {
        'loading-please-wait'           : 'Loading, please wait',
//        'title-click-to-dismiss'        : 'Click to dismiss',
        'error-timeout-exceeded'        : 'Timeout exceeded', 
        'error-not-wellformed-response' : 'Not wellformed response', 
        'error-unknown'                 : 'Unknown error',
        'edit-zipper-open'              : 'Options ▼', 
        'edit-zipper-closed'            : 'Options ►',
        'zipper-open'                   : '▼ hide replies', 
        'zipper-closed'                 : '► view replies',
        'zipper-empty'                  : '∅ no replies',
        'message-as-initial'            : 'is initial message',
        'message-as-reply-to'           : 'in reply to',
        'title-create-new-message'      : 'Create new message',
        'validation-date-in-past'		: 'Date should be set and be in future',
//        'validation-no-nickname'		: 'Nickname will be picked randomly',
//        'validation-no-superkey'		: 'Superkey will be picked randomly',
        'validation-no-message'			: 'Message should be given',
        'validation-no-message'			: 'Message should be given',
        'validation-message-to-large'	: 'Message shouldn\'t be longer than ' + BB_CONST['max-message-len'] + ' characters',
        'validation-no-worldkey'		: 'Worldkey will be picked randomly',
        'validation-no-secret'			: 'Secret should be given'
        
    };
//  ----> Interface i8n
//    $('#f_search_info').prop('title', BB_I8N['title-click-to-dismiss']);
// <----
    

    
    
    // initial action:
    $('#f_search_info').hide();    // hide serch error bar
    
//    $('#f_search_info').click(function (e) {
//    	$(this).stop().hide();
//        $(this).stop(); // we show this div with .slideDown, so just force it to slideUp
//    });
    
    $('.status-info').live('click', function () {
        statusHide($(this));
    });
    
    $('.created').live('click', function() {
    	$(this).hide().queue(function(){
    		$(this).parent().children('.expire').fadeToggle(100);
    		$(this).dequeue();
    	});
    });
    
    $('.expire').live('click', function() {
    	$(this).hide().queue(function(){
    		$(this).parent().children('.created').fadeToggle(100);
    		$(this).dequeue();
    	});
    });
    
    
    

    
    function wrap_error_message(err) {
        if (undefined == err) {
            err = 'Unknown error';
        } else if ('parsererror' == err) {
            err = 'Not wellformed response';
        } else if ('timeout' == err) {
            err = 'Request timeout. Please try again later';
        }
        
        return err;
    }
    
    function call_json(method, args, success, error) {
        return $.ajax({
            type:     'POST',
            url:      'process.php',
            dataType: 'json',
            timeout:  30000,
            
            data:     {
                'method' : method,
                'args' : args
            },
            
            success: function (data, textStatus, jqXHR) {
                if (data.hasOwnProperty('resp')) {
                	success(data.resp);
                } else {
                	error(data.err);
                }
            },
            
            error: function (jqXHR, textStatus, errorThrown) {
                error(textStatus);
            }
        });        
    }
    

    $('#f_search').bind('submit', function(e) {
        e.preventDefault(); // <-- important
        
//        $(this).find('#btn_search').prop('disabled', true);//.delay(1000).prop('disabled', false);
        
        statusShowInfo($('#f_search_info'), BB_I8N['loading-please-wait']);

        call_json('get_message', {'id' : $(this).children('input').val()},
                
                function (res) {
                    $('#f_search_info').click();
                    console.log('success search', res);
                    insert_envelopes("#content", res.resp, true);
                    document.location.hash = res.resp[0].id;
                    $('#uid_input').val('');
                    
                },
                
                function (err) {
                	statusShowError($('#f_search_info'), err);
                });
    });
               
    function create_envelope(v, hash) {
        var c = $('#system .envelope').clone();    // container
        
        $(c).attr('id', v['id']);
        $(c).find('.self_id').text('#'+v['id']).attr('href', '#' + v['id']);
        
        if (v['parent_id']) {
            $(c).find('.msg_role').text(BB_I8N['message-as-reply-to']);
            $(c).find('.parent_id').text('#'+v['parent_id']).attr('href', '#'+hash);
        } else {
            $(c).find('.msg_role').text(BB_I8N['message-as-initial']);
        }
        
        $(c).find('.created > .datetime').text(utToDate(v['created']));
        $(c).find('.expire > .datetime').text(utToDate(v['expire']));
        
        $(c).find('.message').text(v['message']);
        $(c).find('.nickname').text(v['nickname']);
        
        if (v['nested'] > 0) {
            $(c).addClass('has-responses');
            set_zipper($(c).find('.zipper'), 'closed');
        } else {
            set_zipper($(c).find('.zipper'), 'empty');
        }
        
        $(c).find('.expire').hide();
        return c;
    }
    
    function set_zipper(elem, state) {
        if ('open' == state) {
            $(elem).removeClass()
                   .addClass('zipper open').text(BB_I8N['zipper-open']);
        } else if ('closed' == state) {
            $(elem).removeClass()
            .addClass('zipper closed').text(BB_I8N['zipper-closed']);
        } else {
            $(elem).removeClass()
            .addClass('zipper empty').text(BB_I8N['zipper-empty']);
        }
    }
    
    function insert_envelopes(point, data, remove) {
        var initial_flag = $(point).attr('id') == 'content';
        
        if (remove) {
            if (!initial_flag) {
                $(point).find('.responses').first().children().remove();
                $(point).removeClass('has-responses');
                set_zipper($(point).find('.zipper'), 'empty');
            } else {
                $(point).children().remove();
            }
        }
        
        if (data.length) {
            if (!initial_flag) {
                $(point).addClass('has-responses');
                set_zipper($(point).find('.zipper'), 'open');
            }
            
            $(data).each(function(i, v){
                (initial_flag ? $(point) : $(point).find('.responses').first())
                    .append(create_envelope(v, initial_flag ? '' : $(point).attr('id')));
            });
            
        } 
    }

    function utToDate(timestamp) {
        var d = new Date(Number(timestamp)*1000);

        return (d.getMonth() < 9 ? '0' + (d.getMonth()+1) : d.getMonth()+ 1)
               + "/" + (d.getDate() < 10 ? '0' +d.getDate() : d.getDate())
               + "/" +  String(d.getFullYear()).substr(2) + " " + d.toLocaleTimeString();
    }
    
    function statusHide(elem) {
		return $(elem).stop(true, true)
					  .hide()
		              .removeClass('info error');
    }
    
    function statusShowInfo(elem, text) {
    	return statusHide(elem)
	    	  .removeClass('info error').addClass('info')
              .text(text)
              .fadeIn('fast').delay(30000).fadeOut('fast');    	
    }
    
    function statusShowError(elem, err) {
    	return statusHide(elem)
        	   .removeClass('info error').addClass('error')
        	   .text(wrap_error_message(err))
        	   .fadeIn('fast').delay(5000).fadeOut('fast');
    }
    
    $('.zipper').live('click', function(e) {
        if ($(this).hasClass('empty')) { // do not check empty, TODO: but what about dynamic adding?
            return false;
        }

        var container = $(this).parent();
        var responses = container.find('.responses');
        
        if (!responses.children().length) {

        	statusShowInfo($(container).find('.status-info').first(), BB_I8N['loading-please-wait']);

            call_json('get_children', {'id' : container.attr('id')},
                    
                function (res) {
            		$(container).find('.status-info').first().click();
                    insert_envelopes(container, res, true);
                },
                
                function (err) {
                    statusShowError($(container).find('.zipper-info').first(), err);
                }
            );
            
        } else {
        
            if ($(this).hasClass('open')) {
                $(this).parent().children('.responses').slideUp().queue(
                        function () {
                            set_zipper($(container).find('.zipper').first(), 'closed');
                            $(this).dequeue();
                        }
                );
            } else {
                $(this).parent().children('.responses').slideDown();
                set_zipper($(container).find('.zipper').first(), 'open');
            }
        }
        
    });
    
    /* CREATION, editing, etc.                      */
    $('#btn_create').click(function (e) {
    	$('#edit').dialog( {
    		'title'     : BB_I8N['title-create-new-message'],
    		'modal'     : true,
    		'resizable' : false,
    		'width'     : '44em',
    		'height'    : 'auto'
    	});
    	
    	$('#edit input[type="checkbox"]').attr('checked', false).parent().find('div').hide();
    	
    	$('#edit').find('.fe_value').val('').change();

    	$("#fe_expire_selector").val('v_not_set').change();
    	
    	$('#fe_optgrp').removeClass().hide();
    	$("#fe_optgrp_zipper").click();
    });
    
    
    $('#fe_expire').datetimepicker({
    	hourGrid: 3,
    	timeFormat: 'hh:mm:ss',
    	minuteGrid: 10,
    	secondGrid: 15,
    	showSecond: true,
    	changeYear: true
    });
    
    $("#fe_expire_selector").change(function () {
    	var d = new Date();
    	
    	
    	if ('v_1_hour' == $(this).val()) {
    		d.setHours(d.getHours()+1);
    	} else if ('v_1_day' == $(this).val()) {
    		d.setHours(d.getHours()+24);
    	} else if ('v_1_week' == $(this).val()) {
    		d.setDate(d.getDate()+7);
    	} else if ('v_1_month' == $(this).val()) {
    		d.setMonth(d.getMonth()+1);
    	} else if ('v_1_year' == $(this).val()) {
    		d.setFullYear(d.getFullYear()+1);
    	} else if ('v_as_defined' == $(this).val()) {
    		d.setMinutes(d.getMinutes()+10);
    	} else {
    		d = new Date();
    	}
    	
    	
    	$("#fe_expire").datetimepicker('setDate', d);
//    	$("#fe_expire").datetimepicker('setDate', d);
    	
    	
    	if ('v_as_defined' == $(this).val()) {
    		$("#fe_expire").show();
    		$("#fe_expire").select();
    	} else {
    		$("#fe_expire").hide();
    	}
    	
    });
    
    $('#edit input[type="checkbox"]').click(function(){
    	
    	if($(this).attr('checked')) {
    		$(this).parent().find('div').fadeIn().find('input').val('').change();
    		
    	} else {
    		$(this).parent().removeClass('notice error')
    			   .prop('title', '');
    		
    		$(this).parent().find('div').fadeOut()
    									.children('input').change();
    		
    	}
    });
    
    $("#fe_optgrp_zipper").click(function(e) {
    	e.preventDefault(); // <-- important
    	
    	if ($('#fe_optgrp').hasClass('toggled')){
    		$('#fe_optgrp').removeClass();
    		$(this).text(BB_I8N['edit-zipper-open']);
    		$('#fe_optgrp').slideDown('fast');
    	} else {
    		$('#fe_optgrp').addClass('toggled');
    		$(this).text(BB_I8N['edit-zipper-closed']);
    		$('#fe_optgrp').slideUp('fast');
    		
    		$('#edit input[type="checkbox"]').each(function (i, v) {
    			
    			if ($(v).attr('checked')) {	// bad hack
    				$(v).attr('checked', false);
    				$(v).click().attr('checked', false);
    			}
    		});
    	}
    });
    
    // ----------------------------------------------- form validation controls
    
    
    $("#fe_expire").bind('change keyup', function () {
    	
    	if ( (new Date()) < (new Date($(this).val())) ) {
    		$(this).parent().removeClass('error')
    			            .prop('title', '');
    	} else {
    		$(this).parent().removeClass('error').addClass('error')
    		.prop('title', BB_I8N['validation-date-in-past']);
    	}
    });
    
    
//    $("#fe_nickname").bind('change keyup', function () {
//    	
//    	if ( $(this).val().trim().length ) {
//    		$(this).parent().removeClass('notice')
//    		.prop('title', '');
//    	} else {
//    		$(this).parent().removeClass('notice').addClass('notice')
    	//	.prop('title', BB_I8N['validation-no-nickname']);
//    	}
//    	
//    });
    
//    $("#fe_superkey").bind('change keyup', function () {
//    	
//    	if ( $(this).val().trim().length ) {
//    		$(this).parent().removeClass('notice')
//    		.prop('title', '');
//    	} else {
//    		$(this).parent().removeClass('notice').addClass('notice')
//    		.prop('title', BB_I8N['validation-no-superkey']);
//    	}
    	
//    });
    
    $("#fe_message").bind('change keyup', function () {
    	
    	var len = $(this).val().trim().length;
    	
    	if ( len ) {
    		$(this).parent().removeClass('error')
    		.prop('title', '');
    		
    		if (len > BB_CONST['max-message-len']) {
    			$(this).parent().removeClass('error').addClass('error')
    			.prop('title', BB_I8N['validation-message-to-large']);
    		}
    	} else {
    		$(this).parent().removeClass('error').addClass('error')
	    	.prop('title', BB_I8N['validation-no-message']);
    	}
    	
    	$('#fe_message_cntr').text(BB_CONST['max-message-len'] - len);
    });
    
    // two in one
    $("#fe_worldkey, #fe_secret").bind('change keyup', function () {
    	var alarm = 'fe_secret' == $(this).prop('id') ? 'error' : 'notice';
    	var actkey = 'fe_secret' == $(this).prop('id') ? 'validation-no-secret' : 'validation-no-worldkey';
    	
    	if ($(this).parent().parent().children('input').prop('checked')) {
    		
	    	if ( $(this).val().trim().length) {
	    		$(this).parent().parent().removeClass(alarm)
	    		.prop('title', '');
	    	} else {
	    		
	    		$(this).parent().parent().removeClass(alarm).addClass(alarm)
	    							     .prop('title', BB_I8N[actkey]);
	    	}
    	}
    });
    
    // send button validator
   $('.fe_value').bind('change keyup', function () {
	   $('#fe_submit').prop('disabled', $('.fe_opt.error').length);
   });
    
    
    
    $('#f_edit').bind('submit', function(e) {
        e.preventDefault(); // <-- important
        $("#fe_expire").change(); // updated expiration time
        var infobar = $(this).parent().find('.status-info');
        
        statusShowInfo(infobar , BB_I8N['loading-please-wait']);     
        
        
        var args = {};	// arguments
        
        $('.fe_value').each(function(i, v) {
        	args[$(v).attr('id').substr(3)] = $(v).val(); 
        });
        
        args['expire']      = (new Date(args['expire'])).getTime()/1000	;
        args['secresp']    = $('#fe_secresp').is(':checked') ? 1 : 0;
        args['secstorage'] = $('#fe_secstorage').is(':checked') ? 1 : 0;
        
        call_json('create_new_message', args,
        
        		function (res) {
		        	$(infobar).click();
		        	$('#edit').dialog('close');
		        	
                    insert_envelopes("#content", res.resp, true);
                    document.location.hash = res.resp[0].id;
                    $('#uid_input').val('');
                    
                    showNoticeDialog($.extend(res.info, {id: res.resp[0].id, expire: res.resp[0].expire}));
                },
                
                function (err) {
                    statusShowError(infobar, err);
                }
        );
    });
    
    
    function showNoticeDialog(data) {
    	console.log(data);
    	$('#notice_id').text(data.id);
//    	$('#notice_superkey').text(data.superkey);
//    	$('#notice_nickname').text(data.nickname);
    	$('#notice_expire').text(utToDate(data.expire));
    	
    	if (data.worldkey) {
    		$('#notice_worldkey').text(data.worldkey)
    		                     .parent().show();
    	} else {
    		$('#notice_worldkey').parent().hide();
    	}

    	if (data.secret) {
    		$('#notice_secret').text(data.secret)
    		                   .parent().show();
    	} else {
    		$('#notice_secret').parent().hide();
    	}
    	
    	
    	$('#edit_notice').dialog( {
    		'modal'	    : true,
    		'resizable' : false,
    		'width'		: 'auto',
    		'close' : function() {
    			console.log('close notice', $(this));
    			$(this).find('span[class!=label]').text('');
    		}
    	});
    }
    
    
    if((hashlen = document.location.hash.length) > 2) {
    	$('#uid_input').val(document.location.hash.substr(1));
    	$('#btn_search').click();
    	
    }
    
    
    
});